查看原文
其他

一个好的持续交付流水线是怎样的?

张燎原、张裕 阿里云云栖号 2022-07-13

作者 |  张燎原、张裕

文章来源 | 阿里巴巴云效团队


上一讲我们讲了持续部署的4个目标:准确可预期的部署结果、部署过程不影响线上服务、有可持续部署的软件增量、低成本和高效地部署发布,并分析了如何做到。


可是,有了好的持续部署实践,如何才能规模化落地呢?



承载实践最好的方式就是工具。持续部署过程的最好载体就是流水线,因为持续部署本身就是一个逐级递进的流水线。


持续发布流水线



如上图所示,我们可以看到,从最早拉取代码、构建、验证、部署,整个过程是一个逐级递进的过程。如果代码发生变化,或配置发生变化,或代码依赖发生变化,流水线将会被重新触发。从拉取代码开始,直至流程执行完成或中断。我们会按照构建的配置来构建制品,将制品保存到制品仓库,产生构建产物,接下来我们会基于构建产物做验证,验证通过就可以进入部署,部署成功就意味着这个特性已经被成功发到了线上的运行环境中。


在图中我们增加了几个部分,包括研发管理平台、配置中心、监控中心、运维发布平台。


在最简化的流水线里面我们看不到这些,但是在大家的实际工作当中会存在这几个概念:


  • 我们在执行流水线的时候,会跟研发管理平台做交互,比如是否有统一的构建规则;在整个公司的层面或者是部门的层面是否有统一的约束,比如代码的检测标准,可能是公司统一的,这些都会在研发管理平台维护。


  • 配置中心是管理服务的特性开关和动态配置等,配置中心的配置是需要下发给运行中的服务的。


  • 流水线的发布过程和监控中心打通,监控数据的变化,反过来会影响发布,所以整个流水线和监控需要做集成。这个集成可以通过人,但是更好的方式是通过工具链。


  • 部署策略一般沉淀在运维同学的脑子里,或者是运维平台的工具里,这些策略要被应用到流水线上,部署过程当中流水线和运维发布平台有非常强的耦合。


  • 另一个很重要的点,我们在运维平台上有很多安全策略和敏感信息,这些是不可以,或者是不能承载在流水线或者代码中的,需要通过运维发布平台做管控。


这样,我们通过流水线跟我们现有的研发系统就形成了有机的整合,以达到高效发布的目的。


一个好的流水线是怎样的?


既然流水线是如此重要的载体,一个好的流水线应该是什么样的呢?


首先,流水线应该是可描述的,流水线可以像一幅画或者一项工作那样被具象化出来。特别重要的是流水线可以具象化表达研发模式,通过流水线保证发布流程的一致性。基于流水线可以把实践快速复制,如应用同一条流水线的模板就可以应用同一个实践。


第二,流水线应该是可观测的。整个发布过程发到哪、发了什么、中间有什么问题、成功还是失败,是可观测的,并且这个观测是和监控打通的,这样就可以保证发布过程有保障。


第三,整个过程是自动化的。比如构建完不需要到验证阶段再手动触发,整个过程是自动流转的。流程应该建立在工具的基础上,不依赖人,这就是自动化。


以从右到左、面向终态的思维来看,我们的终态是有一个稳定可预期的系统,为此需要找到一个稳定可预期的软件的制品版本,达到一致性的环境,再去进行部署。


部署的时候要符合上一讲所说的4个原则。无论是持续集成、持续测试,无非是要获取确定的软件制品,然后按照4个原则部署上去,所有的这些能力和活动都是为了最终的目标来服务的。


流水线应用举例


我们结合例子来看一下确定持续交付流水线的整个过程。


首先是模板。我们会在团队或者是公司层面有一些最佳实践的模板,比如说有JAVA后端应用的流水线模板,流程上从代码扫描开始,执行测试,然后是构建和部署。有了这个模板之后,可以在团队内所有JAVA后端应用间复用。



第二是团队统一管控和能力复用,比如统一定义某些环境变量,在运行中注入Secret或者账号信息,这些不希望在代码中明文存储,但是我们会通过工具注入下去。假设把devops.test.local作为我们自己的研发管理平台,我们可以通过类似上图的方式与之集成,我们也可以在平台里定义敏感信息,或者维护公共变量,然后在每一个流水线的步骤里面引用,达到全局复用的效果。



其次,流水线是具备观测性的。我们可以知道当下流水线的情况,最新的一次运行是否完成、有没有连续失败的情况等。从流水线视角可以看到一个feature从开发、集成到发布的整个阶段是什么样的,中间是否存在问题。比如图中的流水线从开发完到集成之间有很长时间的等待,这里可能存在阻塞,可以下钻进行进一步分析。



下面是我们基于云效做的DevOps方案大图。云效包含完整的DevOps研发工具链。以需求的角度,在任务看板里面拿到相应的开发任务就可以开始开发,提交代码,然后在代码层面做检测和安全扫描,接着执行构建,集成,验证,最后上线。



右上角的“1-1-1”是我们的愿景:我们希望做到1个小时的发布前置时长,从代码提交到发布到生产1个小时完成,我们希望每天至少有1个可发布的版本,我们希望每一个应用每周至少发布1次。


“1-1-1”能够帮助我们去发现在整个集成发布过程当中存在的问题:为什么不能做到1小时的发布前置时长?由哪些原因导致的?这时就需要找到问题的关键所在,其实是给自己设定一个目标,然后再看现状。现状跟目标之间有一段距离,这个距离就是需要解决的问题。


有了基于云效的Codeup、Flow,也可以构建其他的交付模式,比如说移动APP的持续交付模式。



另一个是Web应用,常见的云的服务端的发布。



或者是前端,直接把相应的前端构建物发送到CDN,这些都是比较常见的发布流程。



总结


  • 发布是将软件特性增量交付给最终用户的过程;


  • 软件交付需要做到准确、低成本及高效;


  • 持续部署应该:准确、可预期的部署结果;部署过程不影响线上服务;有持续可部署的软件增量;及低成本、高效地部署发布;


  • 准确地部署需要明确的待发布制品,明确的运行环境及明确的发布过程和发布策略;


  • 无服务中断的部署过程需要做到滚动式部署、部署可观测、可干预及可回滚;


  • 软件增量应该是完整的,可验证的及可独立部署发布的单元;


  • 低成本、高效的部署发布需要减少发布批量及保障发布的顺畅性


  • 持续发布流水线是规模化规范团队软件发布的有效手段,软件的发布过程应该做到可见、可控、可加速、可度量。




云栖号的伙伴群开启了,欢迎大家入群聊起来!

大家想看什么内容,我们可以一起聊聊~

👇👇👇


 ✨ 精彩推荐✨  


 最 新 活 动 

🔥 2022年阿里云上云采购季大促全攻略

🔥 招募通知!采购季云产品体验官缺人!

捡漏!域名、公司注册1元起!

请查收!视频云采购季的优惠攻略!

云网络2022上云采购季活动玩法攻略!


 技 术 好 文 

讨论:Java 系统中的错误码设计

3个案例,详解如何选择合适的研发模式

2022 你的团队距离持续部署还有多远?

开发之痛:稳定的测试环境,怎么就那么难


 企 业 案 例 

香侬科技:上云!让世界听到中文NLP的声音

璀璨智行:V2X车路协同智慧交通

英赛克:解决工业互联网安全问题

企业上云|数字化转型经验分享

点击上方  一键关注
从现在开始 学习技术


↓ 直通2022年采购季主会场!🔑  

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存